import java.util.HashMap;
import java.util.Map;

/**
 * @Author ZhangCuirong
 * @Date 2025/9/4 13:41
 * @description:
 */
public class Solution525 {
    public int findMaxLength(int[] nums) {
        int n = nums.length;
        int[] prefixSum = new int[n + 1];
        // 修正1：修复三元运算符优先级，正确计算前缀和（0→-1，1→1）
        for (int i = 1; i <= n; i++) {
            prefixSum[i] = prefixSum[i - 1] + (nums[i - 1] == 0 ? -1 : 1);
        }

        Map<Integer, Integer> map = new HashMap<>();
        // 修正2：只存储前缀和首次出现的下标（不覆盖）
        for (int i = 0; i <= n; i++) {
            if (!map.containsKey(prefixSum[i])) { // 仅当不存在时才存储
                map.put(prefixSum[i], i);
            }
        }

        int max = 0;
        // 遍历所有可能的结束位置，计算最长子数组
        for (int end = 0; end <= n; end++) {
            int sum = prefixSum[end];
            if (map.containsKey(sum)) {
                int start = map.get(sum);
                // 修正3：子数组长度为 end - start（对应 nums[start ... end-1]）
                max = Math.max(max, end - start);
            }
        }
        return max;
    }

    public static void main(String[] args) {
        Solution525 solution = new Solution525();
        System.out.println(solution.findMaxLength(new int[]{0, 1})); // 输出 2
        System.out.println(solution.findMaxLength(new int[]{0, 1, 0})); // 输出 2
        System.out.println(solution.findMaxLength(new int[]{0, 1, 1, 1, 1, 1, 0, 0, 0})); // 输出 6
    }
}

